﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using namespace std;


// 1.
//class Base 
//{
//public:
//	void func5() { cout << "Base::func5" << endl; }
//protected:
//	int a = 1;
//private:
//	 C++98的⽅法 
//	Base()
//	{}
//};
//
// 可以用私有化父类构造函数来迫使子类不能继承
// 但是会出现 不定义子类对象不报错 的情况
//class Derive : public Base
//{
//	void func4() { cout << "Derive::func4" << endl; }
//protected:
//	int b = 2;
//};
//
//int main()
//{
//	/*Base b;报错
//	Derive d;*/
//	return 0;
//}


//// 2.
//// C++11的⽅法 
//// 意为：最终类（下面不能有类来继承）
//class Base final
//{
//public:
//	void func5() { cout << "Base::func5" << endl; }
//protected:
//	int a = 1;
//};


// 友元函数不能被继承

// 前置声明(相互依赖时可以使用)
class Student;

class Person
{
public:
	friend void Display(const Person& p, const Student& s);
protected:
	string _name; // 姓名 
};
class Student : public Person
{
	friend void Display(const Person& p, const Student& s);// 变成Student的友元
protected:
	int _stuNum; // 学号 
};
void Display(const Person& p, const Student& s)
{
	cout << p._name << endl;
	cout << s._stuNum << endl;
}
int main()
{
	Person p;
	Student s;
	// 编译报错：error C2248: “Student::_stuNum”: ⽆法访问 protected 成员 
	// 解决⽅案：Display也变成Student 的友元即可 
	Display(p, s);
	return 0;
}

// 静态成员是父子类共用一个的，存储位置也是一样的
// 可以用类名::或者对象.进行访问静态成员